البرمجة

Flask مع PostgreSQL خطوة بخطوة

جدول المحتوى

استخدام قاعدة بيانات PostgreSQL في تطبيق Flask: تكامل متكامل بين القوة والمرونة

تُعد قواعد البيانات العمود الفقري لأي تطبيق ويب يعتمد على تخزين واسترجاع البيانات، ومع تطور أطر العمل وتنوع استخدامات الويب، أصبح التكامل بين قاعدة البيانات وإطار العمل من العوامل الحاسمة في كفاءة النظام. Flask، كإطار عمل خفيف وقابل للتخصيص لبناء تطبيقات الويب بلغة Python، يتميز بسهولة دمجه مع قواعد بيانات متعددة. PostgreSQL، من جهتها، تُعد واحدة من أقوى قواعد البيانات العلائقية مفتوحة المصدر، وتتميز بقوتها، وأمانها، وتوافقها مع المعايير. وعند دمج Flask مع PostgreSQL، نحصل على بيئة تطوير مرنة وقوية تلائم التطبيقات الصغيرة والكبيرة على حد سواء.

يتناول هذا المقال كل ما يتعلق بعملية دمج واستخدام قاعدة بيانات PostgreSQL داخل تطبيق Flask، بداية من إعداد البيئة إلى تنفيذ الاستعلامات المعقدة، مرورًا بأدوات ORM، والتعامل مع جلسات الاتصال، وطرق التهيئة والنشر.


أولًا: لمحة عن PostgreSQL وFlask

ما هي PostgreSQL؟

PostgreSQL هي قاعدة بيانات علائقية مفتوحة المصدر، تُعرف بدقتها في التعامل مع البيانات المعقدة ودعمها للامتدادات والوظائف المتقدمة. تدعم PostgreSQL:

  • المعاملات (Transactions)

  • العلاقات (Joins)

  • الفهارس (Indexes)

  • دعم JSON وXML

  • الأمن والتحكم في الصلاحيات

  • النسخ الاحتياطي والاستعادة

ما هو Flask؟

Flask هو إطار عمل مصغر (Microframework) بلغة Python لتطوير تطبيقات الويب. يتميز بأنه لا يفرض بنية صارمة، مما يجعله مرنًا للغاية وقابلًا للتوسع حسب الحاجة. يوفر ميزات مثل:

  • التعامل مع المسارات (Routing)

  • قوالب Jinja2

  • دعم الجلسات

  • تكامل سهل مع أدوات ORM مثل SQLAlchemy


ثانيًا: الإعداد الأولي للمشروع

لدمج Flask مع PostgreSQL، نحتاج إلى إعداد البيئة البرمجية التي تشمل:

إنشاء بيئة افتراضية وتثبيت الحزم المطلوبة

bash
python -m venv venv source venv/bin/activate pip install Flask psycopg2-binary Flask-SQLAlchemy

إعداد مشروع Flask أساسي

python
from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'تطبيق Flask مع PostgreSQL يعمل بنجاح!'

ثالثًا: إعداد قاعدة بيانات PostgreSQL

تثبيت PostgreSQL

يتم تثبيت PostgreSQL عبر الأوامر التالية على Ubuntu:

bash
sudo apt update sudo apt install postgresql postgresql-contrib

إعداد قاعدة البيانات والمستخدم

bash
sudo -u postgres psql CREATE DATABASE flaskdb; CREATE USER flaskuser WITH PASSWORD 'strongpassword'; ALTER ROLE flaskuser SET client_encoding TO 'utf8'; ALTER ROLE flaskuser SET default_transaction_isolation TO 'read committed'; ALTER ROLE flaskuser SET timezone TO 'UTC'; GRANT ALL PRIVILEGES ON DATABASE flaskdb TO flaskuser;

رابعًا: تكامل Flask مع PostgreSQL باستخدام SQLAlchemy

SQLAlchemy هو أشهر ORM بلغة Python، ويتيح التعامل مع قواعد البيانات من خلال كائنات بايثون بدلًا من كتابة استعلامات SQL يدويًا.

إعداد الاتصال بقاعدة البيانات

python
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://flaskuser:strongpassword@localhost/flaskdb' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

إنشاء كائن قاعدة البيانات

python
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy(app)

تعريف النماذج (Models)

python
class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def __repr__(self): return f'{self.username}>'

إنشاء الجداول

python
with app.app_context(): db.create_all()

خامسًا: العمليات الأساسية على قاعدة البيانات

إضافة بيانات

python
new_user = User(username='ahmed', email='[email protected]') db.session.add(new_user) db.session.commit()

قراءة البيانات

python
user = User.query.filter_by(username='ahmed').first()

تحديث البيانات

python
user.email = '[email protected]' db.session.commit()

حذف البيانات

python
db.session.delete(user) db.session.commit()

سادسًا: تنظيم المشروع باستخدام Blueprints وتوسعة Flask-Migrate

استخدام Flask-Migrate لترحيل قواعد البيانات

bash
pip install Flask-Migrate
python
from flask_migrate import Migrate migrate = Migrate(app, db)
bash
flask db init flask db migrate -m "Initial migration" flask db upgrade

سابعًا: إدارة الجلسات والاتصال الآمن

Flask يعمل بشكل افتراضي مع SQLite، لكن عند استخدام PostgreSQL، يجب إدارة الجلسات بشكل محكم خصوصًا عند الاستخدام في بيئة الإنتاج.

  • استخدام scoped_session لتفادي مشاكل تعدد الخيوط

  • إدارة الاتصال داخل app_context

  • إغلاق الجلسات بشكل يدوي عند الحاجة

  • استخدام التجزئة والرموز المميزة (tokens) عند التعامل مع معلومات حساسة


ثامنًا: التعامل مع الاستعلامات المعقدة

استعلامات SQL اليدوية

python
result = db.session.execute('SELECT * FROM user WHERE username = :name', {'name': 'ahmed'}) for row in result: print(row)

استخدام وظائف PostgreSQL المتقدمة

يدعم SQLAlchemy الكثير من الميزات المتقدمة لـ PostgreSQL مثل:

  • الاستعلامات الشرطية

  • أنواع البيانات المركبة

  • دعم JSON وARRAY

  • الاستعلامات الفرعية (Subqueries)


تاسعًا: تحسين الأداء باستخدام الفهارس والتحسينات في PostgreSQL

تُعتبر الفهارس من أهم أدوات تحسين الأداء في PostgreSQL. من خلال SQLAlchemy يمكن إنشاء الفهارس على الأعمدة الحساسة:

python
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), index=True) ...

ويمكن كذلك استخدام الاستعلامات المنضبطة:

  • تحديد الأعمدة المطلوبة فقط (load_only)

  • استخدام limit وoffset للصفحات

  • تفعيل التهيئة المُسبقة (joinedload) لتفادي استعلامات N+1


عاشرًا: النشر والإعداد لبيئة الإنتاج

إعداد قاعدة بيانات PostgreSQL على خادم بعيد

  • تهيئة صلاحيات الوصول عن بعد (pg_hba.conf)

  • تفعيل المنفذ 5432 في الجدار الناري

  • إعداد اسم المضيف وربطه بـ DNS

إعداد التطبيق للعمل على خادم ويب مثل Gunicorn وNGINX

bash
gunicorn app:app

ويتم إعداد NGINX كواجهة أمامية:

nginx
server { listen 80; server_name example.com; location / { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

جدول يوضح مقارنة بين SQLite وPostgreSQL في بيئة Flask:

الميزة SQLite PostgreSQL
الأداء مع البيانات الكبيرة ضعيف ممتاز
دعم الاستعلامات المعقدة محدود متقدم جدًا
الأمان ضعيف عالي
التوافر في الإنتاج غير موصى به موصى به بقوة
تعدد المستخدمين لا يدعمه بكفاءة يدعمه بكفاءة
دعم الفهارس والمشغلات جزئي كامل

الحادي عشر: الأخطاء الشائعة عند استخدام PostgreSQL مع Flask

  1. عدم استخدام app.app_context() عند العمل مع الجلسات في البرامج النصية

    يؤدي ذلك إلى أخطاء متعلقة بغياب السياق.

  2. نسيان تنفيذ db.create_all() قبل استخدام النماذج

    مما يؤدي إلى أخطاء عدم وجود الجداول.

  3. إغفال استخدام commit() بعد التعديلات

    حيث لا يتم حفظ البيانات دون استخدامه.

  4. عدم تهيئة إعدادات البيئة بشكل آمن

    مثل كشف كلمة مرور قاعدة البيانات في الشيفرة البرمجية.


الثاني عشر: التكامل مع الأدوات الخارجية وتحليل البيانات

  • استخدام PostgreSQL مع أدوات التحليل مثل Pandas:

python
import pandas as pd df = pd.read_sql('SELECT * FROM user', db.engine)
  • إعداد نسخ احتياطي تلقائي باستخدام pg_dump

bash
pg_dump -U flaskuser flaskdb > backup.sql
  • مزامنة البيانات مع تطبيقات خارجية عبر واجهات REST أو GraphQL


الثالث عشر: تحديثات PostgreSQL وتوافقها مع Flask

مع كل إصدار جديد من PostgreSQL، يتم إضافة تحسينات في الأداء ودعم إضافي لأنواع بيانات جديدة. من المهم التحقق من توافق SQLAlchemy مع النسخ الجديدة، خاصة فيما يتعلق بوظائف JSONB وPostGIS في التطبيقات الجغرافية.


المراجع

  1. PostgreSQL Official Documentation

  2. Flask-SQLAlchemy Documentation